home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 23 / Amiga Format AFCD23 (Feb 1998, Issue 107).iso / +look_here_1st!+ / reader_requests / alienbreed3d2 / cheesesauce / testnoise.s < prev    next >
Text File  |  1997-11-28  |  10KB  |  654 lines

  1.  
  2. **************************************
  3. * I want a routine to calculate all the
  4. * info needed for the sound player to
  5. * work, given say position of noise, volume
  6. * and sample number.
  7.  
  8.  
  9.  move.w #100,Noisevol
  10.  move.w #1,Samplenum
  11.  move.w #100,Noisex
  12.  move.w #0,Noisez
  13.  move.b #1,IDNUM
  14.  bsr MakeSomeNoise
  15.  
  16.  move.w #100,Noisevol
  17.  move.w #1,Samplenum
  18.  move.w #100,Noisex
  19.  move.w #0,Noisez
  20.  move.b #2,IDNUM
  21.  bsr MakeSomeNoise
  22.  
  23.  move.w #100,Noisevol
  24.  move.w #1,Samplenum
  25.  move.w #100,Noisex
  26.  move.w #0,Noisez
  27.  move.b #3,IDNUM
  28.  bsr MakeSomeNoise
  29.  
  30.  move.w #100,Noisevol
  31.  move.w #1,Samplenum
  32.  move.w #0,Noisex
  33.  move.w #0,Noisez
  34.  move.b #4,IDNUM
  35.  bsr MakeSomeNoise
  36.  
  37. testit:
  38.  move.w #200,Noisevol
  39.  move.w #1,Samplenum
  40.  move.w #100,Noisex
  41.  move.w #0,Noisez
  42.  move.b #2,IDNUM
  43.  bsr MakeSomeNoise
  44.  
  45.  
  46.  rts
  47.  
  48.  
  49. MakeSomeNoise:
  50.  
  51. ; Plan for new sound handler:
  52. ; It is sent a sample number,
  53. ; a position relative to the
  54. ; player, an id number and a volume.
  55. ; Also notifplaying.
  56.  
  57. ; indirect inputs are the available
  58. ; channel flags and whether or not
  59. ; stereo sound is selected.
  60.  
  61. ; the algorithm must decide
  62. ; whether the new sound is more
  63. ; important than the ones already
  64. ; playing. Thus an 'importance'
  65. ; must be calculated, probably
  66. ; using volume.
  67.  
  68. ; The output needs to be:
  69.  
  70. ; Write the pointers and volumes of
  71. ; the sound channels
  72.  
  73.  
  74.  tst.b notifplaying
  75.  beq.s dontworry
  76.  
  77. ; find if we are already playing
  78.  
  79.  move.b IDNUM,d0
  80.  move.w #7,d1
  81.  lea CHANNELDATA,a3
  82. findsameasme
  83.  tst.b (a3)
  84.  bne.s notavail
  85.  cmp.b 1(a3),d0
  86.  beq SameAsMe
  87. notavail:
  88.  add.w #4,a3
  89.  dbra d1,findsameasme
  90.  bra dontworry
  91. SameAsMe
  92.  rts
  93.  
  94. noiseloud: dc.w 0
  95.  
  96. dontworry:
  97.  
  98. ; Ok its fine for us to play a sound.
  99. ; So calculate left/right volume.
  100.  
  101.  move.w Noisex,d1
  102.  muls d1,d1
  103.  move.w Noisez,d2
  104.  muls d2,d2
  105.  move.w #64,d3
  106.  move.w #32767,noiseloud
  107.  moveq #1,d0
  108.  add.l d1,d2
  109.  beq pastcalc
  110.  
  111.  move.w #31,d0
  112. .findhigh
  113.  btst d0,d2
  114.  bne .foundhigh
  115.  dbra d0,.findhigh
  116. .foundhigh
  117.  asr.w #1,d0
  118.  clr.l d3
  119.  bset d0,d3
  120.  move.l d3,d0
  121.  
  122.  move.w d0,d3
  123.  muls d3,d3    ; x*x
  124.  sub.l d2,d3    ; x*x-a
  125.  asr.l #1,d3    ; (x*x-a)/2
  126.  divs d0,d3    ; (x*x-a)/2x
  127.  sub.w d3,d0    ; second approx
  128.  bgt .stillnot0
  129.  move.w #1,d0
  130. .stillnot0
  131.  
  132.  move.w d0,d3
  133.  muls d3,d3
  134.  sub.l d2,d3
  135.  asr.l #1,d3
  136.  divs d0,d3
  137.  sub.w d3,d0    ; second approx
  138.  bgt .stillnot02
  139.  move.w #1,d0
  140. .stillnot02
  141.  
  142.  move.w Noisevol,d3
  143.  ext.l d3
  144.  asl.l #6,d3
  145.  cmp.l #32767,d3
  146.  ble.s .nnnn
  147.  move.l #32767,d3
  148. .nnnn
  149.  
  150.  asr.w #2,d0
  151.  addq #1,d0
  152.  divs d0,d3
  153.  
  154.  move.w d3,noiseloud
  155.  
  156.  cmp.w #64,d3
  157.  ble.s notooloud
  158.  move.w #64,d3
  159. notooloud:
  160.  
  161. pastcalc:
  162.  
  163.     ; d3 contains volume of noise.
  164.     
  165.  move.w d3,d4
  166.  tst.b STEREO
  167.  beq NOSTEREO
  168.  
  169.  move.w d3,d2
  170.  muls Noisex,d2
  171.  asl.w #2,d0
  172.  divs d0,d2
  173.  
  174.  bgt.s quietleft
  175.  add.w d2,d4
  176.  bge.s donequiet
  177.  move.w #0,d4
  178.  bra.s donequiet
  179. quietleft:
  180.  sub.w d2,d3
  181.  bge.s donequiet
  182.  move.w #0,d3
  183. donequiet:
  184.  
  185. ; d3=leftvol?
  186. ; d4=rightvol?
  187.  
  188.  clr.w needleft
  189.  
  190.  cmp.b d3,d4
  191.  bgt.s RightLouder
  192.  
  193. ; Left is louder; is it MUCH louder?
  194.  
  195.  st needleft
  196.  move.w d3,d2
  197.  sub.w d4,d2
  198.  cmp.w #32,d2
  199.  slt needright
  200.  bra aboutsame
  201.  
  202. RightLouder:
  203.  st needright
  204.  move.w d4,d2
  205.  sub.w d3,d2
  206.  cmp.w #32,d2
  207.  slt needleft
  208.  
  209. aboutsame:
  210.  
  211.  
  212. ; Find least important sound on left
  213.  
  214.  move.l #0,a2
  215.  move.l #0,d5
  216.  move.w #32767,d2
  217.  move.b IDNUM,d0
  218.  lea LEFTCHANDATA,a3
  219.  move.w #3,d1
  220. FindLeftChannel
  221.  tst.b (a3)
  222.  bne.s .notactive
  223.  cmp.b 1(a3),d0
  224.  beq.s FOUNDLEFT
  225.  cmp.w 2(a3),d2
  226.  blt.s .notactive
  227.  move.w 2(a3),d2
  228.  move.l a3,a2
  229.  move.w d5,d6
  230.  
  231. .notactive:
  232.  add.w #4,a3
  233.  add.w #1,d5
  234.  dbra d1,FindLeftChannel
  235.  move.l a2,a3
  236.  bra.s gopastleft
  237. FOUNDLEFT:
  238.  move.w d5,d6
  239. gopastleft:
  240.  tst.l a3
  241.  bne.s FOUNDALEFT
  242. NONOISE:
  243.  rts
  244. FOUNDALEFT:
  245.  
  246.  cmp.w noiseloud,d3
  247.  bge.s NONOISE
  248.  
  249. ; d6 = channel number
  250.  move.b d0,1(a3)
  251.  move.w d3,2(a3)
  252.  
  253.  move.w Samplenum,d5
  254.  move.l #SampleList,a3
  255.  move.l (a3,d5.w*8),a1
  256.  move.l 4(a3,d5.w*8),a2
  257.  
  258.  tst.b d6
  259.  seq NoiseMade0LEFT
  260.  beq.s .chan0
  261.  cmp.b #2,d6
  262.  slt NoiseMade1LEFT
  263.  blt .chan1
  264.  seq NoiseMade2LEFT
  265.  beq .chan2
  266.  st NoiseMade3LEFT
  267.  
  268.  move.b d5,LEFTPLAYEDTAB+9
  269.  move.b d3,LEFTPLAYEDTAB+1+9
  270.  move.b d4,LEFTPLAYEDTAB+2+9
  271.  move.b d3,vol3left
  272.  move.l a1,pos3LEFT
  273.  move.l a2,Samp3endLEFT
  274.  bra dorightchan
  275.  
  276. .chan0: 
  277.  move.b d5,LEFTPLAYEDTAB
  278.  move.b d3,LEFTPLAYEDTAB+1
  279.  move.b d4,LEFTPLAYEDTAB+2
  280.  move.l a1,pos0LEFT
  281.  move.l a2,Samp0endLEFT
  282.  move.b d3,vol0left
  283.  bra dorightchan
  284.  
  285. .chan1:
  286.  move.b d5,LEFTPLAYEDTAB+3
  287.  move.b d3,LEFTPLAYEDTAB+1+3
  288.  move.b d4,LEFTPLAYEDTAB+2+3
  289.  move.b d3,vol1left
  290.  move.l a1,pos1LEFT
  291.  move.l a2,Samp1endLEFT
  292.  bra dorightchan
  293.  
  294. .chan2: 
  295.  move.b d5,LEFTPLAYEDTAB+6
  296.  move.b d3,LEFTPLAYEDTAB+1+6
  297.  move.b d4,LEFTPLAYEDTAB+2+6
  298.  move.l a1,pos2LEFT
  299.  move.l a2,Samp2endLEFT
  300.  move.b d3,vol2left
  301.  
  302. dorightchan:
  303.  
  304. ; Find least important sound on right
  305.  
  306.  move.l #0,a2
  307.  move.l #0,d5
  308.  move.w #10000,d2
  309.  move.b IDNUM,d0
  310.  lea RIGHTCHANDATA,a3
  311.  move.w #3,d1
  312. FindRightChannel
  313.  tst.b (a3)
  314.  bne.s .notactive
  315.  cmp.b 1(a3),d0
  316.  beq.s FOUNDRIGHT
  317.  cmp.w 2(a3),d2
  318.  blt.s .notactive
  319.  move.w 2(a3),d2
  320.  move.l a3,a2
  321.  move.w d5,d6
  322.  
  323. .notactive:
  324.  add.w #4,a3
  325.  add.w #1,d5
  326.  dbra d1,FindRightChannel
  327.  move.l a2,a3
  328.  bra.s gopastright
  329. FOUNDRIGHT:
  330.  move.w d5,d6
  331. gopastright:
  332.  tst.l a3
  333.  bne.s FOUNDARIGHT
  334.  rts
  335. FOUNDARIGHT:
  336.  
  337. ; d6 = channel number
  338.  move.b d0,1(a3)
  339.  move.w d3,2(a3)
  340.  
  341.  move.w Samplenum,d5
  342.  move.l #SampleList,a3
  343.  move.l (a3,d5.w*8),a1
  344.  move.l 4(a3,d5.w*8),a2
  345.  
  346.  tst.b d6
  347.  seq NoiseMade0RIGHT
  348.  beq.s .chan0
  349.  cmp.b #2,d6
  350.  slt NoiseMade1RIGHT
  351.  blt .chan1
  352.  seq NoiseMade2RIGHT
  353.  beq .chan2
  354.  st NoiseMade3RIGHT
  355.  
  356.  move.b d5,RIGHTPLAYEDTAB+9
  357.  move.b d3,RIGHTPLAYEDTAB+1+9
  358.  move.b d4,RIGHTPLAYEDTAB+2+9
  359.  move.b d4,vol3right
  360.  move.l a1,pos3RIGHT
  361.  move.l a2,Samp3endRIGHT
  362.  rts
  363.  
  364. .chan0: 
  365.  move.b d5,RIGHTPLAYEDTAB
  366.  move.b d3,RIGHTPLAYEDTAB+1
  367.  move.b d4,RIGHTPLAYEDTAB+2
  368.  move.l a1,pos0RIGHT
  369.  move.l a2,Samp0endRIGHT
  370.  move.b d4,vol0right
  371.  rts
  372.  
  373. .chan1:
  374.  move.b d5,RIGHTPLAYEDTAB+3
  375.  move.b d3,RIGHTPLAYEDTAB+1+3
  376.  move.b d4,RIGHTPLAYEDTAB+2+3
  377.  move.b d3,vol1right
  378.  move.l a1,pos1RIGHT
  379.  move.l a2,Samp1endRIGHT
  380.  rts
  381.  
  382. .chan2: 
  383.  move.b d5,RIGHTPLAYEDTAB+6
  384.  move.b d3,RIGHTPLAYEDTAB+1+6
  385.  move.b d4,RIGHTPLAYEDTAB+2+6
  386.  move.l a1,pos2RIGHT
  387.  move.l a2,Samp2endRIGHT
  388.  move.b d3,vol2right
  389.  rts
  390.  
  391. NOSTEREO:
  392.  move.l #0,a2
  393.  move.l #-1,d5
  394.  move.w #32767,d2
  395.  move.b IDNUM,d0
  396.  lea CHANNELDATA,a3
  397.  move.w #7,d1
  398. FindChannel
  399.  tst.b (a3)
  400.  bne.s .notactive
  401.  cmp.b 1(a3),d0
  402.  beq.s FOUNDCHAN
  403.  cmp.w 2(a3),d2
  404.  blt.s .notactive
  405.  move.w 2(a3),d2
  406.  move.l a3,a2
  407.  move.w d5,d6
  408.  add.w #1,d6
  409.  
  410. .notactive:
  411.  add.w #4,a3
  412.  add.w #1,d5
  413.  dbra d1,FindChannel
  414.  
  415.  move.l a2,a3
  416.  bra.s gopastchan
  417. FOUNDCHAN:
  418.  move.w d5,d6
  419.  add.w #1,d6
  420. gopastchan:
  421.  tst.w d6
  422.  bge.s FOUNDACHAN
  423. tooquiet:
  424.  rts
  425. FOUNDMYCHAN:
  426.  move.w 2(a3),d2
  427.  
  428. FOUNDACHAN:
  429.  
  430. ; d6 = channel number
  431.  
  432.  cmp.w noiseloud,d2
  433.  bgt.s tooquiet
  434.  
  435.  move.b d0,1(a3)
  436.  move.w noiseloud,2(a3)
  437.  
  438.  move.w Samplenum,d5
  439.  move.l #SampleList,a3
  440.  move.l (a3,d5.w*8),a1
  441.  move.l 4(a3,d5.w*8),a2
  442.  
  443.  tst.b d6
  444.  beq .chan0
  445.  cmp.b #2,d6
  446.  blt .chan1
  447.  beq .chan2
  448.  cmp.b #4,d6
  449.  blt .chan3
  450.  beq .chan4
  451.  cmp.b #6,d6
  452.  blt .chan5
  453.  beq .chan6
  454.  st NoiseMade3RIGHT
  455.  
  456.  move.b d5,RIGHTPLAYEDTAB+9
  457.  move.b d3,RIGHTPLAYEDTAB+1+9
  458.  move.b d4,RIGHTPLAYEDTAB+2+9
  459.  move.b d4,vol3right
  460.  move.l a1,pos3RIGHT
  461.  move.l a2,Samp3endRIGHT
  462.  rts
  463.  
  464. .chan3:
  465.  st NoiseMade3LEFT
  466.  move.b d5,LEFTPLAYEDTAB+9
  467.  move.b d3,LEFTPLAYEDTAB+1+9
  468.  move.b d4,LEFTPLAYEDTAB+2+9
  469.  move.b d3,vol3left
  470.  move.l a1,pos3LEFT
  471.  move.l a2,Samp3endLEFT
  472.  bra dorightchan
  473.  
  474. .chan0: 
  475.  st NoiseMade0LEFT
  476.  move.b d5,LEFTPLAYEDTAB
  477.  move.b d3,LEFTPLAYEDTAB+1
  478.  move.b d4,LEFTPLAYEDTAB+2
  479.  move.l a1,pos0LEFT
  480.  move.l a2,Samp0endLEFT
  481.  move.b d3,vol0left
  482.  rts
  483.  
  484. .chan1:
  485.  st NoiseMade1LEFT
  486.  move.b d5,LEFTPLAYEDTAB+3
  487.  move.b d3,LEFTPLAYEDTAB+1+3
  488.  move.b d4,LEFTPLAYEDTAB+2+3
  489.  move.b d3,vol1left
  490.  move.l a1,pos1LEFT
  491.  move.l a2,Samp1endLEFT
  492.  rts
  493.  
  494. .chan2: 
  495.  st NoiseMade2LEFT
  496.  move.b d5,LEFTPLAYEDTAB+6
  497.  move.b d3,LEFTPLAYEDTAB+1+6
  498.  move.b d4,LEFTPLAYEDTAB+2+6
  499.  move.l a1,pos2LEFT
  500.  move.l a2,Samp2endLEFT
  501.  move.b d3,vol2left
  502.  rts
  503.  
  504. .chan4: 
  505.  st NoiseMade0RIGHT
  506.  move.b d5,RIGHTPLAYEDTAB
  507.  move.b d3,RIGHTPLAYEDTAB+1
  508.  move.b d4,RIGHTPLAYEDTAB+2
  509.  move.l a1,pos0RIGHT
  510.  move.l a2,Samp0endRIGHT
  511.  move.b d4,vol0right
  512.  rts
  513.  
  514. .chan5:
  515.  st NoiseMade1RIGHT
  516.  move.b d5,RIGHTPLAYEDTAB+3
  517.  move.b d3,RIGHTPLAYEDTAB+1+3
  518.  move.b d4,RIGHTPLAYEDTAB+2+3
  519.  move.b d3,vol1right
  520.  move.l a1,pos1RIGHT
  521.  move.l a2,Samp1endRIGHT
  522.  rts
  523.  
  524. .chan6: 
  525.  st NoiseMade2RIGHT
  526.  move.b d5,RIGHTPLAYEDTAB+6
  527.  move.b d3,RIGHTPLAYEDTAB+1+6
  528.  move.b d4,RIGHTPLAYEDTAB+2+6
  529.  move.l a1,pos2RIGHT
  530.  move.l a2,Samp2endRIGHT
  531.  move.b d3,vol2right
  532.  rts
  533.  
  534.  
  535. audpos1: dc.w 0
  536. audpos1b: dc.w 0
  537. audpos2: dc.w 0
  538. audpos2b: dc.w 0
  539. audpos3: dc.w 0
  540. audpos3b: dc.w 0
  541. audpos4: dc.w 0
  542. audpos4b: dc.w 0
  543.  
  544. vol0left: dc.w 0
  545. vol0right: dc.w 0
  546. vol1left: dc.w 0
  547. vol1right: dc.w 0
  548. vol2left: dc.w 0
  549. vol2right: dc.w 0
  550. vol3left: dc.w 0
  551. vol3right: dc.w 0
  552.  
  553. pos: dc.l 0
  554.  
  555. pos0LEFT: dc.l empty
  556. pos1LEFT: dc.l empty
  557. pos2LEFT: dc.l empty
  558. pos3LEFT: dc.l empty
  559. pos0RIGHT: dc.l empty
  560. pos1RIGHT: dc.l empty
  561. pos2RIGHT: dc.l empty
  562. pos3RIGHT: dc.l empty
  563.  
  564.  
  565. empty: ds.l 100
  566. emptyend:
  567.  
  568.  
  569. playnull0: dc.w 0
  570. playnull1: dc.w 0
  571. playnull2: dc.w 0
  572. playnull3: dc.w 0
  573.  
  574. Samp0endRIGHT: dc.l emptyend
  575. Samp1endRIGHT: dc.l emptyend
  576. Samp2endRIGHT: dc.l emptyend
  577. Samp3endRIGHT: dc.l emptyend
  578. Samp0endLEFT: dc.l emptyend
  579. Samp1endLEFT: dc.l emptyend
  580. Samp2endLEFT: dc.l emptyend
  581. Samp3endLEFT: dc.l emptyend
  582.  
  583. null: ds.b 500
  584. null2: ds.b 500
  585. null3: ds.b 500
  586. null4: ds.b 500
  587.  
  588. Aupt0: dc.l null
  589. Auback0: dc.l null+500
  590. Aupt2: dc.l null3
  591. Auback2: dc.l null3+500
  592. Aupt3: dc.l null4
  593. Auback3: dc.l null4+500
  594. Aupt1: dc.l null2
  595. Auback1: dc.l null2+500
  596.  
  597. NoiseMade0LEFT: dc.b 0
  598. NoiseMade1LEFT: dc.b 0
  599. NoiseMade2LEFT: dc.b 0
  600. NoiseMade3LEFT: dc.b 0
  601. NoiseMade0pLEFT: dc.b 0
  602. NoiseMade1pLEFT: dc.b 0
  603. NoiseMade2pLEFT: dc.b 0
  604. NoiseMade3pLEFT: dc.b 0
  605. NoiseMade0RIGHT: dc.b 0
  606. NoiseMade1RIGHT: dc.b 0
  607. NoiseMade2RIGHT: dc.b 0
  608. NoiseMade3RIGHT: dc.b 0
  609. NoiseMade0pRIGHT: dc.b 0
  610. NoiseMade1pRIGHT: dc.b 0
  611. NoiseMade2pRIGHT: dc.b 0
  612. NoiseMade3pRIGHT: dc.b 0
  613.  
  614. SampleList:
  615.  dc.l 0,0
  616.  dc.l 0,0
  617.  dc.l 0,0
  618.  dc.l 0,0
  619.  dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  620.  dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  621.  dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  622.  dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  623.  
  624.  dc.l 0
  625. Samplenum: dc.w 0
  626. Noisex: dc.w 0
  627. Noisez: dc.w 0
  628. Noisevol: dc.w 0
  629. chanpick: dc.w 0
  630. IDNUM: dc.w 0
  631. needleft: dc.b 0
  632. needright: dc.b 0
  633. notifplaying: dc.w 0
  634. STEREO: dc.b $0
  635. even
  636. prot6: dc.w 0
  637.  
  638.  even
  639.  
  640. CHANNELDATA:
  641. LEFTCHANDATA:
  642.  dc.l $00000000
  643.  dc.l $00000000
  644.  dc.l $FF000000
  645.  dc.l $FF000000
  646. RIGHTCHANDATA:
  647.  dc.l $00000000
  648.  dc.l $00000000
  649.  dc.l $FF000000
  650.  dc.l $FF000000
  651.  
  652. RIGHTPLAYEDTAB: ds.l 20
  653. LEFTPLAYEDTAB: ds.l 20
  654. achan